library(tidyverse)
library(taxonomizr)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
genome_data <- read_csv("../data/mmetsp_ncbi_genome_info.csv") %>%
mutate_at("sample_id", as.character)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
.default = col_character(),
sample_id = col_double(),
`GenBank BioSample` = col_double(),
project_id = col_double(),
latitude = col_double(),
longitude = col_double(),
taxon_id = col_double(),
depth = col_double(),
day_portion_of_day_night_cycle_in_hours = col_double(),
light = col_double(),
experimental_salinity = col_double(),
experimental_temperature = col_double(),
night_portion_of_day_night_cycle_in_hours = col_double(),
ph = col_double(),
environmental_salinity = col_double(),
collection_time = col_time(format = ""),
environmental_temperature = col_double(),
phosphate = col_double(),
nitrate = col_double(),
iron = col_double(),
trace_elements = col_double()
# ... with 21 more columns
)
ℹ Use `spec()` for the full column specifications.
genome_data
report_filenames <- list.files("../results/krakenReports/")
report <- NULL
for(filename in report_filenames){
data <- read_tsv(file.path("../results/krakenReports", filename),
col_names = c("percent", "clade_count", "taxon_count", "kmers", "unique_kmers", "level", "taxid", "name" ))
data$file <- filename
report <- bind_rows(report, data)
}
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
── Column specification ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
percent = col_double(),
clade_count = col_double(),
taxon_count = col_double(),
kmers = col_double(),
unique_kmers = col_double(),
level = col_character(),
taxid = col_double(),
name = col_character()
)
report <- report %>%
mutate(duplicity = kmers/unique_kmers,
ratio_unique = unique_kmers/kmers,
taxid = as.character(taxid)) %>%
separate(file, c("sample_id", "sample_name_main", "fullSpeciesName"), sep = "_-_", remove = F) %>%
filter(clade_count > 1)
taxonomyInfo <- getTaxonomy(unique(report$taxid), sqlFile = "../data/accessionTaxa.sql") %>%
data.frame(taxid = row.names(.), row.names = NULL) %>%
# remove spaces in taxid
mutate(taxid = str_trim(taxid))
report <- report %>%
left_join(., taxonomyInfo, by = "taxid") %>%
left_join(., genome_data[, c("sample_id", "taxon_id")], by = "sample_id") %>%
left_join(., genome_data[, c("sample_id", "species_taxid")], by = "sample_id") %>%
rename(target_taxid = taxon_id,
target_species_taxid = species_taxid) %>%
mutate(is_target_species = (taxid == target_taxid | taxid == target_species_taxid))
report
report %>%
filter(superkingdom == "Bacteria")
nrow(report)
[1] 70584
sum(report$is_target_species)
[1] 24
taxonomyInfo <- getTaxonomy(unique(report$taxid), sqlFile = "../data/accessionTaxa.sql") %>%
data.frame(taxid = row.names(.), row.names = NULL) %>%
# remove spaces in taxid
mutate(taxid = str_trim(taxid))
taxonomyInfo
write_csv(report, "../data/duplicity_report.csv")
report %>%
filter(superkingdom == "Bacteria")
report %>%
filter(superkingdom == "Bacteria",
grepl("^(S|G).*", level)) %>%
ggplot(aes(x = taxon_count/unique_kmers))+
geom_histogram(bins = 30)+
#geom_density()+
xlim(0, 10)

report %>%
filter(
is_target_species) %>%
ggplot(aes(x = log(taxon_count)))+
geom_histogram(bins = 30)#+

#geom_density()+
#xlim(0, 10)
report %>%
filter(superkingdom == "Bacteria",
grepl("^(S|G).*", level),
taxon_count != 0) %>%
ggplot(aes(x =log10(taxon_count)))+
geom_histogram(bins = 30)+
#geom_density()+
xlim(0, 10)+
ylim(0,5000)

report %>%
filter(superkingdom == "Bacteria",
taxon_count/unique_kmers != 0) %>%
ggplot(aes(x = log(taxon_count/unique_kmers)))+
geom_histogram(bins = 30)+
#geom_density()+
xlim(0, 10)

report %>%
filter(superkingdom == "Bacteria",
taxon_count/unique_kmers != 0) %>%
ggplot(aes(x = (taxon_count/unique_kmers)))+
geom_histogram(bins = 30)+
#geom_density()+
xlim(0, 100)+
ylim(0, 5000)

report %>%
filter(superkingdom == "Bacteria") %>%
ggplot(aes(x = log(clade_count)))+
geom_histogram(bins = 30)+
#geom_density()+
xlim(0, 10)

report %>%
filter(!is_target_species,
duplicity > 0) %>%
ggplot(aes(x = (duplicity)))+
geom_histogram()+
scale_x_log10()

report %>%
#filter(is_target_species) %>%
ggplot(aes(x = duplicity))+
facet_wrap(~ifelse(is_target_species,"Target Species", "Other Species"), scales = "free_y")+
geom_histogram()+
scale_x_continuous(labels = scales::number_format(accuracy = 1),
trans = "log10",
limits = c(1, 1000),
n.breaks = 8)+
theme_bw()

report %>%
#filter(is_target_species) %>%
ggplot(aes(x = taxon_count))+
facet_wrap(~ifelse(is_target_species,"Target Species", "Other Species"), scales = "free_y", "free_x")+
geom_histogram()+
scale_x_continuous(labels = scales::number_format(accuracy = 1),
trans = "log10")+
theme_bw()
Coercing `nrow` to be an integer.NAs introduced by coercion`nrow` is missing or less than 1 and will be treated as NULL.

report %>%
filter(!is_target_species) %>%
ggplot(aes(x = taxon_count))+
geom_histogram()+
scale_x_continuous(labels = scales::number_format(accuracy = 1),
#trans = "log10",
n.breaks = 10,
limits = c(1, 500))+
theme_bw()

report %>%
filter(superkingdom == "Bacteria") %>%
ggplot(aes(x = (duplicity)))+
geom_histogram(bins = 45)+
#geom_density()+
xlim(0, 50)
report %>%
filter(superkingdom == "Bacteria") %>%
ggplot(aes(x = log(unique_kmers)))+
geom_histogram(bins = 30) +
xlim(0, 10)
exp(2.5)
report %>%
filter(superkingdom == "Bacteria") %>%
ggplot(aes(x = log(unique_kmers)))+
geom_histogram(bins = 30) +
xlim(0, 10)
report %>%
ggplot(aes(x = log(unique_kmers)))+
geom_histogram(bins = 50)# +
xlim(0,25)
nrow(report)
unique(report$level)
report %>%
filter(clade_count > 200,
taxon_count > 10,
unique_kmers > 10,
duplicity < 70
)
report %>%
filter(superkingdom %in% c("Archaea", "Bacteria"),
clade_count > 1000,
taxon_count > 500,
unique_kmers > 10,
duplicity < 10,
grepl("^(S|G).*", level)
#level %in% c("G","G1", "G2", "S", "S1", "S2", "S3")
)
report %>%
ggplot(aes(x = duplicity))+
geom_histogram(bins = 30) +
#geom_density()+
xlim(0, 100)
report %>%
ggplot(aes(x = ratio_unique))+
geom_histogram(bins = 30)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGF4b25vbWl6cikKCmBgYAoKYGBge3J9Cmdlbm9tZV9kYXRhIDwtIHJlYWRfY3N2KCIuLi9kYXRhL21tZXRzcF9uY2JpX2dlbm9tZV9pbmZvLmNzdiIpICU+JQogIG11dGF0ZV9hdCgic2FtcGxlX2lkIiwgYXMuY2hhcmFjdGVyKQpnZW5vbWVfZGF0YQpgYGAKCgpgYGB7cn0KcmVwb3J0X2ZpbGVuYW1lcyA8LSBsaXN0LmZpbGVzKCIuLi9yZXN1bHRzL2tyYWtlblJlcG9ydHMvIikKYGBgCgpgYGB7cn0KcmVwb3J0IDwtIE5VTEwKCmZvcihmaWxlbmFtZSBpbiByZXBvcnRfZmlsZW5hbWVzKXsKICBkYXRhIDwtIHJlYWRfdHN2KGZpbGUucGF0aCgiLi4vcmVzdWx0cy9rcmFrZW5SZXBvcnRzIiwgZmlsZW5hbWUpLAogICAgICAgICAgICAgICAgICAgY29sX25hbWVzID0gYygicGVyY2VudCIsICJjbGFkZV9jb3VudCIsICJ0YXhvbl9jb3VudCIsICJrbWVycyIsICJ1bmlxdWVfa21lcnMiLCAibGV2ZWwiLCAidGF4aWQiLCAibmFtZSIgKSkKICAKICBkYXRhJGZpbGUgPC0gZmlsZW5hbWUKICAKICByZXBvcnQgPC0gYmluZF9yb3dzKHJlcG9ydCwgZGF0YSkKICAKfQoKcmVwb3J0IDwtIHJlcG9ydCAlPiUKICBtdXRhdGUoZHVwbGljaXR5ID0ga21lcnMvdW5pcXVlX2ttZXJzLAogICAgICAgICByYXRpb191bmlxdWUgPSB1bmlxdWVfa21lcnMva21lcnMsCiAgICAgICAgIHRheGlkID0gYXMuY2hhcmFjdGVyKHRheGlkKSkgJT4lCiAgc2VwYXJhdGUoZmlsZSwgYygic2FtcGxlX2lkIiwgInNhbXBsZV9uYW1lX21haW4iLCAiZnVsbFNwZWNpZXNOYW1lIiksIHNlcCA9ICJfLV8iLCByZW1vdmUgPSBGKSAlPiUKICBmaWx0ZXIoY2xhZGVfY291bnQgPiAxKQoKdGF4b25vbXlJbmZvIDwtIGdldFRheG9ub215KHVuaXF1ZShyZXBvcnQkdGF4aWQpLCBzcWxGaWxlID0gIi4uL2RhdGEvYWNjZXNzaW9uVGF4YS5zcWwiKSAlPiUKICBkYXRhLmZyYW1lKHRheGlkID0gcm93Lm5hbWVzKC4pLCByb3cubmFtZXMgPSBOVUxMKSAlPiUKICAjIHJlbW92ZSBzcGFjZXMgaW4gdGF4aWQKICBtdXRhdGUodGF4aWQgPSBzdHJfdHJpbSh0YXhpZCkpCgpyZXBvcnQgPC0gcmVwb3J0ICU+JQogIGxlZnRfam9pbiguLCB0YXhvbm9teUluZm8sIGJ5ID0gInRheGlkIikgJT4lCiAgbGVmdF9qb2luKC4sIGdlbm9tZV9kYXRhWywgYygic2FtcGxlX2lkIiwgInRheG9uX2lkIildLCBieSA9ICJzYW1wbGVfaWQiKSAlPiUKICBsZWZ0X2pvaW4oLiwgZ2Vub21lX2RhdGFbLCBjKCJzYW1wbGVfaWQiLCAic3BlY2llc190YXhpZCIpXSwgYnkgPSAic2FtcGxlX2lkIikgJT4lCiAgcmVuYW1lKHRhcmdldF90YXhpZCA9IHRheG9uX2lkLAogICAgICAgICB0YXJnZXRfc3BlY2llc190YXhpZCA9IHNwZWNpZXNfdGF4aWQpICU+JQogIG11dGF0ZShpc190YXJnZXRfc3BlY2llcyA9ICh0YXhpZCA9PSB0YXJnZXRfdGF4aWQgfCB0YXhpZCA9PSB0YXJnZXRfc3BlY2llc190YXhpZCkpCgpyZXBvcnQKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIikKYGBgCgpgYGB7cn0KbnJvdyhyZXBvcnQpCnN1bShyZXBvcnQkaXNfdGFyZ2V0X3NwZWNpZXMpCmBgYAoKCmBgYHtyfQp0YXhvbm9teUluZm8gPC0gZ2V0VGF4b25vbXkodW5pcXVlKHJlcG9ydCR0YXhpZCksIHNxbEZpbGUgPSAiLi4vZGF0YS9hY2Nlc3Npb25UYXhhLnNxbCIpICU+JQogIGRhdGEuZnJhbWUodGF4aWQgPSByb3cubmFtZXMoLiksIHJvdy5uYW1lcyA9IE5VTEwpICU+JQogICMgcmVtb3ZlIHNwYWNlcyBpbiB0YXhpZAogIG11dGF0ZSh0YXhpZCA9IHN0cl90cmltKHRheGlkKSkgCgp0YXhvbm9teUluZm8KYGBgCmBgYHtyfQp3cml0ZV9jc3YocmVwb3J0LCAiLi4vZGF0YS9kdXBsaWNpdHlfcmVwb3J0LmNzdiIpCmBgYAoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIpCmBgYApgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIiwKICAgICAgICAgZ3JlcGwoIl4oU3xHKS4qIiwgbGV2ZWwpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0YXhvbl9jb3VudC91bmlxdWVfa21lcnMpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApKwogICNnZW9tX2RlbnNpdHkoKSsKICB4bGltKDAsIDEwKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZmlsdGVyKAogICAgICAgICBpc190YXJnZXRfc3BlY2llcykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKHRheG9uX2NvdW50KSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkjKwogICNnZW9tX2RlbnNpdHkoKSsKICAjeGxpbSgwLCAxMCkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIiwKICAgICAgICAgZ3JlcGwoIl4oU3xHKS4qIiwgbGV2ZWwpLAogICAgICAgICB0YXhvbl9jb3VudCAhPSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPWxvZzEwKHRheG9uX2NvdW50KSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkrCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTApKwogIHlsaW0oMCw1MDAwKQpgYGAKCgoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIsCiAgICAgICAgIHRheG9uX2NvdW50L3VuaXF1ZV9rbWVycyAhPSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsb2codGF4b25fY291bnQvdW5pcXVlX2ttZXJzKSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkrCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTApCmBgYAoKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZmlsdGVyKHN1cGVya2luZ2RvbSA9PSAiQmFjdGVyaWEiLAogICAgICAgICB0YXhvbl9jb3VudC91bmlxdWVfa21lcnMgIT0gMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gKHRheG9uX2NvdW50L3VuaXF1ZV9rbWVycykpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApKwogICNnZW9tX2RlbnNpdHkoKSsKICB4bGltKDAsIDEwMCkrCiAgeWxpbSgwLCA1MDAwKQoKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKGNsYWRlX2NvdW50KSkpKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAzMCkrCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTApCmBgYApgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcighaXNfdGFyZ2V0X3NwZWNpZXMsCiAgICAgICAgIGR1cGxpY2l0eSA+IDApICU+JQogIGdncGxvdChhZXMoeCA9IChkdXBsaWNpdHkpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKSsKICBzY2FsZV94X2xvZzEwKCkKYGBgCgpgYGB7cn0KCnJlcG9ydCAlPiUKICAjZmlsdGVyKGlzX3RhcmdldF9zcGVjaWVzKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkdXBsaWNpdHkpKSsKICBmYWNldF93cmFwKH5pZmVsc2UoaXNfdGFyZ2V0X3NwZWNpZXMsIlRhcmdldCBTcGVjaWVzIiwgIk90aGVyIFNwZWNpZXMiKSwgc2NhbGVzID0gImZyZWVfeSIpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6bnVtYmVyX2Zvcm1hdChhY2N1cmFjeSA9IDEpLAogICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIsCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwgMTAwMCksCiAgICAgICAgICAgICAgICAgICAgIG4uYnJlYWtzID0gOCkrCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgI2ZpbHRlcihpc190YXJnZXRfc3BlY2llcykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gdGF4b25fY291bnQpKSsKICBmYWNldF93cmFwKH5pZmVsc2UoaXNfdGFyZ2V0X3NwZWNpZXMsIlRhcmdldCBTcGVjaWVzIiwgIk90aGVyIFNwZWNpZXMiKSwgc2NhbGVzID0gImZyZWVfeSIsICJmcmVlX3giKSsKICBnZW9tX2hpc3RvZ3JhbSgpKwogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSsKICB0aGVtZV9idygpCmBgYApgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcighaXNfdGFyZ2V0X3NwZWNpZXMpICU+JQogIGdncGxvdChhZXMoeCA9IHRheG9uX2NvdW50KSkrCiAgZ2VvbV9oaXN0b2dyYW0oKSsKICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6Om51bWJlcl9mb3JtYXQoYWNjdXJhY3kgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgI3RyYW5zID0gImxvZzEwIiwKICAgICAgICAgICAgICAgICAgICAgbi5icmVha3MgPSAxMCwKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLCA1MDApKSsKICB0aGVtZV9idygpCmBgYAoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIpICU+JQogIGdncGxvdChhZXMoeCA9IChkdXBsaWNpdHkpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDQ1KSsKICAjZ2VvbV9kZW5zaXR5KCkrCiAgeGxpbSgwLCA1MCkKYGBgCgoKYGBge3J9CnJlcG9ydCAlPiUKICBmaWx0ZXIoc3VwZXJraW5nZG9tID09ICJCYWN0ZXJpYSIpICU+JQogIGdncGxvdChhZXMoeCA9IGxvZyh1bmlxdWVfa21lcnMpKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKSArCiAgeGxpbSgwLCAxMCkKYGBgCgpgYGB7cn0KZXhwKDIuNSkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gPT0gIkJhY3RlcmlhIikgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKHVuaXF1ZV9rbWVycykpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMzApICsKICB4bGltKDAsIDEwKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbG9nKHVuaXF1ZV9rbWVycykpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gNTApIyArCiAgeGxpbSgwLDI1KQpgYGAKYGBge3J9Cm5yb3cocmVwb3J0KQpgYGAKCgpgYGB7cn0KdW5pcXVlKHJlcG9ydCRsZXZlbCkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihjbGFkZV9jb3VudCA+IDIwMCwKICAgICAgICAgdGF4b25fY291bnQgPiAxMCwKICAgICAgICAgdW5pcXVlX2ttZXJzID4gMTAsCiAgICAgICAgIGR1cGxpY2l0eSA8IDcwCiAgICAgICAgICkKYGBgCgpgYGB7cn0KcmVwb3J0ICU+JQogIGZpbHRlcihzdXBlcmtpbmdkb20gJWluJSBjKCJBcmNoYWVhIiwgIkJhY3RlcmlhIiksCiAgICAgICAgIGNsYWRlX2NvdW50ID4gMTAwMCwKICAgICAgICAgdGF4b25fY291bnQgPiA1MDAsCiAgICAgICAgIHVuaXF1ZV9rbWVycyA+IDEwLAogICAgICAgICBkdXBsaWNpdHkgPCAxMCwKICAgICAgICAgZ3JlcGwoIl4oU3xHKS4qIiwgbGV2ZWwpCiAgICAgICAgICNsZXZlbCAlaW4lIGMoIkciLCJHMSIsICJHMiIsICJTIiwgIlMxIiwgIlMyIiwgIlMzIikKICAgICAgICAgKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gZHVwbGljaXR5KSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKSArCiAgI2dlb21fZGVuc2l0eSgpKwogIHhsaW0oMCwgMTAwKQpgYGAKCmBgYHtyfQpyZXBvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmF0aW9fdW5pcXVlKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDMwKQpgYGAKCg==